package cn.tedu.thread;
/*本类用于多线程编程实现方案1:继承Thread类的方式来完成*/
public class TestThread1 {
    public static void main(String[] args) {
        //4.创建线程对象进行测试
        /*4.new对应的是线程的新建状态
         * 5.要想模拟多线程,至少得启动2个线程
         * 如果只启动1个线程,是单线程程序*/  //如果只启动1个线程,是单线程程序
        MyThread t1 = new MyThread("窗口已");
        MyThread t2 = new MyThread("窗口2");
//        MyThread t3 = new MyThread();
//        MyThread t4 = new MyThread();
        /*6.这个run()如果直接这样调用,是没有多线程抢占执行的效果的//这个run()如果直接这样调,是没有多线程抢占执行的效果的,直接跳转过(就绪状态)可运行状态Runnable,和执行/运行状态Running状态, 直接执行run()方法,进入终止状态Dead,
         * 这个写法只是把代码看作是普通方法来调用,谁先调用,谁先执行*/
//        t1.run(); //run()是Thread的方法,子类自己业务需求,需要重写
//        t2.run();
//        t3.run();
//        t4.run();
        /*7.start()对应的状态就是就绪状态,会把刚刚新建好的线程加入到就绪队列之中
         * 至于这个线程什么时候执行,这就是多线程执行的随机性,需要等待OS选中并分配CPU//OS选中多个线程的其中一个线程,然后CPU调度和分配时间片
         * 8.线程的执行具有随机性,也就说t1-t4具体怎么执行
         * 取决于CPU的调度与时间片的分配,我们是决定不了的(OS操作系统底层不同算法决定如何调用不同的进程: 多线程并发情况?!)
         * 9.执行start()时,底层会自动调用我们重写的,包含自己业务的run()
         * */
        t1.start();
        t2.start();
//        t3.start();
//        t4.start();
    }
}

//1.自定义一个多线程类//自定义一个多线程类
class MyThread extends Thread{
    /*1.多线程编程实现方案1:继承Thread类+重写run()*/
    //2.重写run(),里面是我们自己的业务//里面重写了自己的业务


    public MyThread(String name) {
        super(name);
    }

    @Override
    public void run() {
        //2.super.run()表示的是调用父类的业务
        //我们现在想用自己的业务,所以注释掉
        //super.run();
        //3.完成自己的业务:打印10次当前正在执行的线程名称
        for (int i = 0; i < 10; i++) {
            //3.getName()表示可以获取当前正在执行的线程名称//getName()表示可以获取当前正在执行的线程名称
             //* 由于本类继承了Thread类,所以可以直接使用Thread类的这个方法
            System.out.println(i+"="+getName()); //Returns: this thread's name.//父类普通资源能调用父类普通资源//方法可以嵌套调用,只要是普通资源
//            System.out.println(test());  //1)有返回值,可以直接打印内嵌的打印语句和返回值;2)没有返回值,直接调用方法打印
        }
    }

    public void test(){
        System.out.println("test public method");
        //return "test public method";
    }

    public String test1(){
        System.out.println("test public method");
        return "test public method";
    }



}